#include "int.h"

// 定义中断向量表存放系统中由不同中断源所触发的中断处理函数
static IRQTableTypeDef SystemIRQTable[NUMBER_OF_INT_VECTORS];

void SystemIRQTable_Init(void)
{
    for(unsigned int i=0;i<NUMBER_OF_INT_VECTORS;i++)
    {
        SystemIRQTable[i].handler=DefaultHandler;
        SystemIRQTable[i].para=NULL;
    }
}

void DefaultHandler(unsigned int irq_id,void* para)
{
    while(1)
    {

    }
}

//GICC_IAR寄存器bit[9:0]保存中断ID
void System_IRQHandler(unsigned int irq_id)
{
    // 1. 提取中断id
    unsigned int number=irq_id & (0x3FF);
    
    // 2. 过滤无效或特殊的中断号 160中断源=SGI+PPI+SPI,其中SPI共有128个中断源
    if((irq_id >=1020)||(number > NUMBER_OF_INT_VECTORS))
    {
        return;
    }

    // 3. 根据中断ID执行对应的中断处理函数
    SystemIRQTable[number].handler(number,SystemIRQTable[number].para);
}

// 注册中断向量表
void BindIRQTable(IRQn_Type id, IRQCallback handler,void* para)
{
    SystemIRQTable[id].handler=handler;
    SystemIRQTable[id].para=para;
}

void IRQ_Init(void)
{
    // 1. 获取GIC基地址,读取GICD_TYPER寄存器,得到中断组得数量
    // 2. 关闭所有SGI PPI SPI中断
    // 3. 将GICC_PMR寄存器设置为最高优先级以响应所有中断
    // 4. 设置优先级全部为抢占优先级
    // 5. 使能GIC分发器与CPU端口
    GIC_Init(); // 初始化GIC
    SystemIRQTable_Init(); //初始化中断表
}



